<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Systems Programming Language</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Systems_Programming_Language"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Systems_Programming_Language rootpage-Systems_Programming_Language skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Systems Programming Language</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr">
<style data-mw-deduplicate="TemplateStyles:r1236090951">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hatnote{font-style:italic}.mw-parser-output div.hatnote{padding-left:1.6em;margin-bottom:0.5em}.mw-parser-output .hatnote i{font-style:normal}.mw-parser-output .hatnote+link+.hatnote{margin-top:-0.5em}@media print{body.ns-0 .mw-parser-output .hatnote{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div role="note" class="hatnote navigation-not-searchable">This article is about the HP programming language. For the concept of a programming language for systems programming, see <a href="Systems_programming_language" class="mw-redirect" title="Systems programming language">systems programming language</a>.</div>
<style data-mw-deduplicate="TemplateStyles:r1295905060">
/* start https://en.wikipedia.org/ */
.mw-parser-output .infobox-subbox{padding:0;border:none;margin:-3px;width:auto;min-width:100%;font-size:100%;clear:none;float:none;background-color:transparent}.mw-parser-output .infobox-3cols-child{margin:auto}.mw-parser-output .infobox .navbar{font-size:100%}@media screen{html.skin-theme-clientpref-night .mw-parser-output .infobox-full-data:not(.notheme)>div:not(.notheme)[style]{background:#1f1f23!important;color:#f8f9fa}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .infobox-full-data:not(.notheme)>div:not(.notheme)[style]{background:#1f1f23!important;color:#f8f9fa}}@media(min-width:640px){body.skin--responsive .mw-parser-output .infobox-table{display:table!important}body.skin--responsive .mw-parser-output .infobox-table>caption{display:table-caption!important}body.skin--responsive .mw-parser-output .infobox-table>tbody{display:table-row-group}body.skin--responsive .mw-parser-output .infobox-table th,body.skin--responsive .mw-parser-output .infobox-table td{padding-left:inherit;padding-right:inherit}}
/* end https://en.wikipedia.org/ */
</style><table class="infobox vevent"><tbody><tr><th colspan="2" class="infobox-above" style="background-color:#e0e0e0;">Systems Programming Language</th></tr><tr><th scope="row" class="infobox-label"><a href="Programming_paradigm" title="Programming paradigm">Paradigms</a></th><td class="infobox-data"><a href="Procedural_programming" title="Procedural programming">procedural</a>, <a href="Imperative_programming" title="Imperative programming">imperative</a>, <a href="Structured_programming" title="Structured programming">structured</a></td></tr><tr><th scope="row" class="infobox-label">Family</th><td class="infobox-data"><a href="ALGOL" title="ALGOL">ALGOL</a></td></tr><tr><th scope="row" class="infobox-label">First appeared</th><td class="infobox-data">1972<span style="display:none"> (<span class="bday dtstart published updated">1972</span>)</span></td></tr><tr><th colspan="2" class="infobox-header" style="background-color: #EEEEEE;">Influenced by</th></tr><tr><td colspan="2" class="infobox-full-data"><a href="ALGOL_60" title="ALGOL 60">ALGOL 60</a>, <a href="Executive_Systems_Problem_Oriented_Language" class="mw-redirect" title="Executive Systems Problem Oriented Language">ESPOL</a></td></tr><tr><th colspan="2" class="infobox-header" style="background-color: #EEEEEE;">Influenced</th></tr><tr><td colspan="2" class="infobox-full-data">ZSPL, Micro-SPL, <a href="Action!_(programming_language)" title="Action! (programming language)">Action!</a></td></tr></tbody></table>
<p><b>Systems Programming Language</b>, often shortened to <b>SPL</b> but sometimes known as <b>SPL/3000</b>, was a <a href="Procedural_programming" title="Procedural programming">procedurally-oriented</a> <a href="Programming_language" title="Programming language">programming language</a> written by <a href="Hewlett-Packard" title="Hewlett-Packard">Hewlett-Packard</a> for the <a href="HP_3000" title="HP 3000">HP 3000</a> <a href="Minicomputer" title="Minicomputer">minicomputer</a> line and first introduced in 1972. SPL was used to write the HP 3000's primary <a href="Operating_system" title="Operating system">operating system</a>, <a href="Multi-Programming_Executive" class="mw-redirect" title="Multi-Programming Executive">Multi-Programming Executive</a> (MPE). Similar languages on other platforms were generically referred to as <a href="System_programming_language" title="System programming language">system programming languages</a>, confusing matters.
</p><p>Originally known as <b>Alpha Systems Programming Language</b>, named for the development project that produced the 3000-series, SPL was designed to take advantage of the Alpha's <a href="Stack_machine" title="Stack machine">stack-based processor</a> design. It is patterned on <a href="Executive_Systems_Problem_Oriented_Language" class="mw-redirect" title="Executive Systems Problem Oriented Language">ESPOL</a>, a similar <a href="ALGOL" title="ALGOL">ALGOL</a>-derived language used by the <a href="Burroughs_B5000" class="mw-redirect" title="Burroughs B5000">Burroughs B5000</a> <a href="Mainframe" class="mw-redirect" title="Mainframe">mainframe</a> systems, which also influenced a number of 1960s languages like <a href="PL360" title="PL360">PL360</a> and <a href="JOVIAL" title="JOVIAL">JOVIAL</a>.
</p><p>Through the mid-1970s, the success of the HP systems produced a number of SPL offshoots. Examples include <b>ZSPL</b> for the <a href="Zilog_Z80" title="Zilog Z80">Zilog Z80</a> processor, and <b>Micro-SPL</b> for the <a href="Xerox_Alto" title="Xerox Alto">Xerox Alto</a>. The later inspired <a href="Action!_(programming_language)" title="Action! (programming language)">Action!</a> for <a href="Atari_8-bit_computers" title="Atari 8-bit computers">Atari 8-bit computers</a>, which was fairly successful. The latter more closely followed <a href="Pascal_programming_language" class="mw-redirect" title="Pascal programming language">Pascal</a> syntax, losing some of SPL's idiosyncrasies.
</p><p>SPL was widely used during the lifetime of the original 16-bit version of the HP 3000 platform. In the 1980s, the HP 3000 and MPE were reimplemented in an <a href="Emulator" title="Emulator">emulator</a> running on the <a href="PA-RISC" title="PA-RISC">PA-RISC</a>-based <a href="HP_9000" title="HP 9000">HP 9000</a> platforms. HP promoted Pascal as the favored system language on PA-RISC and did not provide an SPL compiler. This caused <a href="Code_maintenance" class="mw-redirect" title="Code maintenance">code maintenance</a> concerns, and 3rd party SPL <a href="Compiler" title="Compiler">compilers</a> were introduced to fill this need.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="History">History</h2></div>
<p><a href="Hewlett-Packard" title="Hewlett-Packard">Hewlett-Packard</a> introduced their first <a href="Minicomputer" title="Minicomputer">minicomputers</a>, the <a href="HP_2100" title="HP 2100">HP 2100</a> series, in 1967. The machines had originally been designed by an external team working for <a href="Union_Carbide" title="Union Carbide">Union Carbide</a> and intended mainly for industrial embedded control uses, not the wider data processing market. HP saw this as a natural fit with their existing instrumentation business and initially pitched it to those users. In spite of this, HP found that the machine's <a href="Price/performance_ratio" class="mw-redirect" title="Price/performance ratio">price/performance ratio</a> was making them increasingly successful in the business market.<sup id="cite_ref-FOOTNOTELeibson2017_1-0" class="reference"><a href="#cite_note-FOOTNOTELeibson2017-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-2116A_2-0" class="reference"><a href="#cite_note-2116A-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup>
</p><p>During this period, the concept of <a href="Time_sharing" class="mw-redirect" title="Time sharing">time sharing</a> was becoming popular, especially as <a href="Core_memory" class="mw-redirect" title="Core memory">core memory</a> costs fell and systems began to ship with more memory. In 1968, HP introduced a bundled system using two 2100-series machine running <a href="HP_Time-Shared_BASIC" title="HP Time-Shared BASIC">HP Time-Shared BASIC</a>, which provided a complete <a href="Operating_system" title="Operating system">operating system</a> as well as the <a href="BASIC_programming_language" class="mw-redirect" title="BASIC programming language">BASIC programming language</a>. These two-machine systems, collectively known as HP 2000s, were an immediate success.<sup id="cite_ref-SMECC_3-0" class="reference"><a href="#cite_note-SMECC-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> HP BASIC was highly influential for many years, and its syntax can be seen in a number <a href="Microcomputer" title="Microcomputer">microcomputer</a> BASICs, including <a href="Palo_Alto_TinyBASIC" class="mw-redirect" title="Palo Alto TinyBASIC">Palo Alto TinyBASIC</a>, <a href="Integer_BASIC" title="Integer BASIC">Integer BASIC</a>, <a href="North_Star_BASIC" title="North Star BASIC">North Star BASIC</a>, <a href="Atari_BASIC" title="Atari BASIC">Atari BASIC</a>, and others.
</p><p>Designers at HP began to wonder "If we can produce a time-sharing system this good using a junky computer like the 2116, think what we could accomplish if we designed our own computer."<sup id="cite_ref-FOOTNOTEGreen2004_4-0" class="reference"><a href="#cite_note-FOOTNOTEGreen2004-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup> To this end, in 1968 the company began putting together a larger team to design a new mid-sized architecture. New team members included those who had worked on <a href="Burroughs_Corporation" title="Burroughs Corporation">Burroughs</a> and <a href="IBM" title="IBM">IBM</a> <a href="Mainframe" class="mw-redirect" title="Mainframe">mainframe</a> systems, and the resulting concepts bore a strong resemblance to the highly successful <a href="Burroughs_B5000" class="mw-redirect" title="Burroughs B5000">Burroughs B5000</a> system. The B5000 used a <a href="Stack_machine" title="Stack machine">stack machine</a> processor that made <a href="Multiprogramming" class="mw-redirect" title="Multiprogramming">multiprogramming</a> simpler to implement, and HP selected this same architecture for the new concept.<sup id="cite_ref-FOOTNOTEEdler1995_5-0" class="reference"><a href="#cite_note-FOOTNOTEEdler1995-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p><p>Two implementations were considered, a 32-bit mainframe-scale machine known as Omega, and a 16-bit design known as Alpha. Almost all effort was on the Omega, but in June 1970, Omega was canceled. This led to an extensive redesign of Alpha to differentiate it from the 2100s, and it eventually emerged with plans for an even more aggressive operating system design. Omega had intended to run in <a href="Batch_mode" class="mw-redirect" title="Batch mode">batch mode</a> and use a smaller computer, the "front end", to process interactions with the user. This was the same operating concept as the 2000 series. However, yet-another-2000 would not be enough for Alpha, and the decision was made to have a single operating for batch, interactive and even <a href="Real-time_computing" title="Real-time computing">real-time</a> operation.<sup id="cite_ref-FOOTNOTEEdler1995_5-1" class="reference"><a href="#cite_note-FOOTNOTEEdler1995-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p><p>To make this work, it needed an advanced <a href="Computer_bus" class="mw-redirect" title="Computer bus">computer bus</a> design with extensive <a href="Direct_memory_access" title="Direct memory access">direct memory access</a> (DMA) and required an advanced <a href="Operating_system" title="Operating system">operating system</a> (OS) to provide quick responses to user actions. The B5000 was also unique, for its time, in that its operating system and core utilities were all programmed in a <a href="High-level_language" class="mw-redirect" title="High-level language">high-level language</a>, <a href="Executive_Systems_Problem_Oriented_Language" class="mw-redirect" title="Executive Systems Problem Oriented Language">ESPOL</a>. ESPOL was a derivative of the ALGOL language tuned to work on the B5000's, a concept that was highly influential in the 1960s and led to new languages like <a href="JOVIAL" title="JOVIAL">JOVIAL</a>, <a href="PL/360" class="mw-redirect" title="PL/360">PL/360</a>, and <a href="BCPL" title="BCPL">BCPL</a>. The HP team decided they would also use an ALGOL-derived language for their operating systems work. HP's similar language was initially known as the Alpha Systems Programming Language.<sup id="cite_ref-FOOTNOTEEdler1995_5-2" class="reference"><a href="#cite_note-FOOTNOTEEdler1995-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p><p>Alpha took several years to develop before emerging in 1972 as the HP 3000. The machine was on the market for only a few months before it was clear it simply wasn't working right, and HP was forced to recall all 3000's already sold. It was reintroduced in late 1973 with most of its problems having been fixed. A major upgrade to the entire system, the CX machine, and MPE-C to run on it, reformed its image and the 3000 went on to be another major success during the second half of the 1970s.<sup id="cite_ref-FOOTNOTEEdler1995_5-3" class="reference"><a href="#cite_note-FOOTNOTEEdler1995-5"><span class="cite-bracket">[</span>5<span class="cite-bracket">]</span></a></sup>
</p><p>This success made SPL almost as widespread as the 2000 series' BASIC, and like that language, SPL resulted in a number of versions for other platforms. Notable among them was Micro-SPL, a version written for the <a href="Xerox_Alto" title="Xerox Alto">Xerox Alto</a> workstation. This machine had originally used BCPL as its primary language, but dissatisfaction with its performance led <a href="Henry_Baker_(computer_scientist)" title="Henry Baker (computer scientist)">Henry Baker</a> to design a non-recursive language that he implemented with Clinton Parker in 1979.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>6<span class="cite-bracket">]</span></a></sup> Clinton would then further modify Micro-SPL to produce <a href="Action!_(programming_language)" title="Action! (programming language)">Action!</a> for <a href="Atari_8-bit_computers" title="Atari 8-bit computers">Atari 8-bit computers</a> in 1983.<sup id="cite_ref-7" class="reference"><a href="#cite_note-7"><span class="cite-bracket">[</span>7<span class="cite-bracket">]</span></a></sup>
</p><p>HP reimplemented the HP 3000 system on the PA-RISC chipset, running a new version of the operating system known as MPE/iX. MPE/iX had two modes, in "native mode" it ran applications that had been recompiled for the PA-RISC using newer Pascal compilers, while under "compatible mode" it could run all existing software via emulation. HP did not supply a native mode compiler for MPE/iX so it was not an easy process to move existing software to the new platform. To fill the need, Allegro Consultants wrote an SPL-compatible language named "SPLash!" that could compile to original HP 3000 code to run within the emulator, or to native mode. This offered a porting pathway for existing SPL software.<sup id="cite_ref-8" class="reference"><a href="#cite_note-8"><span class="cite-bracket">[</span>8<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Language">Language</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Basic_syntax">Basic syntax</h3></div>
<p>SPL generally follows ALGOL 60 syntax conventions, and will be familiar to anyone with experience in ALGOL or its descendants, like <a href="Pascal_(programming_language)" title="Pascal (programming language)">Pascal</a> and <a href="Modula-2" title="Modula-2">Modula-2</a>. Like those languages, program statements can span multiple physical lines and end with a semicolon. Comments are denoted with the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">COMMENT</code> keyword, or by surrounding the comment text in << and >>.<sup id="cite_ref-FOOTNOTESPL19841.2,_1.3_9-0" class="reference"><a href="#cite_note-FOOTNOTESPL19841.2,_1.3-9"><span class="cite-bracket">[</span>9<span class="cite-bracket">]</span></a></sup>
</p><p>Statements are grouped into blocks using BEGIN and END, although, as in Pascal, the END of a program must be followed by a period. The program as a whole is surrounded by BEGIN and END., similar to Pascal, but lacking a PROGRAM keyword or similar statement at the top.<sup id="cite_ref-FOOTNOTESPL19841.1_10-0" class="reference"><a href="#cite_note-FOOTNOTESPL19841.1-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup> The reason for this is that SPL allows any block of code to be used as a program on its own, or compiled into another program to act as a library. The creation of code as a program or subprogram was not part of the language itself, handled instead by placing the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">$CONTROL SUBPROGRAM</code> <a href="Compiler_directive" class="mw-redirect" title="Compiler directive">compiler directive</a> at the top of the file.<sup id="cite_ref-FOOTNOTESPL19841.5_11-0" class="reference"><a href="#cite_note-FOOTNOTESPL19841.5-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>
</p><p>The language provided the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">INTRINSIC</code> keyword to provide an easy method for declaring external procedures, thus avoiding the need for the programmer to declare the procedure parameter types and order. All user-accessible system service declarations (such as file system, process handling, communications, and the like) were available through this mechanism, and users could also add their own procedure declarations to the system's <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">INTRINSIC</code> list. This is similar to, but more refined and narrower scope than the C-language #include mechanism.
</p><p>In contrast to Pascal, where <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">PROCEDURE</code> and <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">FUNCTION</code> were separate concepts, SPL uses a more <a href="C_programming_language" class="mw-redirect" title="C programming language">C-like</a> approach where any <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">PROCEDURE</code> can be prefixed with a type to turn it into a function. In keeping with the syntax of other ALGOL-like languages, the types of the parameters were listed after the name, not part of it. For instance:<sup id="cite_ref-FOOTNOTESPL19841.11_12-0" class="reference"><a href="#cite_note-FOOTNOTESPL19841.11-12"><span class="cite-bracket">[</span>12<span class="cite-bracket">]</span></a></sup>
</p>
<pre>INTEGER PROCEDURE FACT(N); VALUE N; INTEGER N;
</pre>
<p>Declares a function FACT that takes a value N that is an integer. The <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">VALUE</code> indicates that this variable is "pass-by-value" and therefore changes to it inside the procedure will not be seen by the caller.<sup id="cite_ref-FOOTNOTESPL19847–4_13-0" class="reference"><a href="#cite_note-FOOTNOTESPL19847–4-13"><span class="cite-bracket">[</span>13<span class="cite-bracket">]</span></a></sup> The procedure sets its return value by an assignment statement to its name:
</p>
<pre>FACT := expression;
</pre>
<p>Although frowned upon, ALGOL and Pascal allowed code to be labeled using a leading name ending with a colon, which could then be used for the target of loops and <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">GO TO</code> statements. One minor difference is that SPL required the label names to be declared in the variable section using the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">LABEL</code> keyword.<sup id="cite_ref-FOOTNOTESPL19843.15_14-0" class="reference"><a href="#cite_note-FOOTNOTESPL19843.15-14"><span class="cite-bracket">[</span>14<span class="cite-bracket">]</span></a></sup>
</p><p>SPL added to this concept with the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">ENTRY</code> statement which allowed these labels to be further defined as "entry points" that could be accessed from the command line. Labels named in the entry statement(s) were exposed to the operating system and could be called from the RUN command. For instance, one could write a program containing string functions to convert to uppercase or lowercase, and then provide ENTRY points for these two. This could be called from the command line as <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">RUN $STRINGS,TOUPPER</code>.<sup id="cite_ref-FOOTNOTESPL19841.13,_1.14_15-0" class="reference"><a href="#cite_note-FOOTNOTESPL19841.13,_1.14-15"><span class="cite-bracket">[</span>15<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Data_types">Data types</h3></div>
<p>Where SPL differs most noticeably from ALGOL is that its data types are very machine specific, based on the 3000's 16-bit <a href="Big-endian" class="mw-redirect" title="Big-endian">big-endian</a> word format.<sup id="cite_ref-FOOTNOTESPL19841.1_10-1" class="reference"><a href="#cite_note-FOOTNOTESPL19841.1-10"><span class="cite-bracket">[</span>10<span class="cite-bracket">]</span></a></sup>
</p><p>The <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">INTEGER</code> type is a 16-bit signed type, with 15 bits of value and the <a href="Least_significant_bit" class="mw-redirect" title="Least significant bit">least significant bit</a> as the sign. <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">DOUBLE</code> is a 32-bit integer, <i>not</i> a floating-point type. <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">REAL</code> is a 32-bit floating-point value with 22 bits for the mantissa and 9 for the exponent, while <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">LONG</code> is a 64-bit floating-point value with 54 bits of mantissa and 9 bits exponent.<sup id="cite_ref-FOOTNOTESPL19842.1–2.3_16-0" class="reference"><a href="#cite_note-FOOTNOTESPL19842.1–2.3-16"><span class="cite-bracket">[</span>16<span class="cite-bracket">]</span></a></sup>
</p><p><code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">BYTE</code> is used for character processing, consisting of a 16-bit machine word holding a single 8-bit character in the least-significant bits. Arrays of type BYTE pack two 8-bit characters per 16-bit machine word. <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">LOGICAL</code> is an unsigned 16-bit integer type that, when used in a conditional expression, returns true if the least-significant bit is 1 and false otherwise. Unsigned integer arithmetic can be performed on LOGICAL data and any overflow is ignored. There is no equivalent of a <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">PACKED</code> modifier as found in Pascal, so <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">LOGICAL</code> is somewhat wasteful of memory <sup id="cite_ref-FOOTNOTESPL19842.4_17-0" class="reference"><a href="#cite_note-FOOTNOTESPL19842.4-17"><span class="cite-bracket">[</span>17<span class="cite-bracket">]</span></a></sup> when used only to store a single binary digit, although SPL offers bit string manipulation as an alternative.
</p><p>Like C, data is <a href="Weakly_typed" class="mw-redirect" title="Weakly typed">weakly typed</a>, memory locations and variable storage are intermixed concepts, and one can access values directly through their locations. For instance, the code:
</p>
<pre>INTEGER A,B,C
LOGICAL D=A+2
</pre>
<p>defines three 16-bit integer variables, A, B and C, and then a LOGICAL, also a 16-bit value. The <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">=</code>, like Pascal, means "is equivalent to", not "gets the value of", which uses <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">:=</code> in Algol-like languages. So the second line states "declare a variable D that is in the same memory location as A+2", which in this case is also the location of the variable C. This allows the same value to be read as an integer via C or a logical through D.<sup id="cite_ref-FOOTNOTESPL19843.2_18-0" class="reference"><a href="#cite_note-FOOTNOTESPL19843.2-18"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup>
</p><p>This syntax may seem odd to modern readers where memory is generally a <a href="Black_box" title="Black box">black box</a>, but it has a number of important uses in systems programming where particular memory locations hold values from the underlying hardware. In particular, it allows one to define a variable that points to the front of a table of values, and then declare additional variables that point to individual values within the table. If the table location changes, only a single value has to change, the initial address, and all of the individual variables will automatically follow in their proper relative offsets.<sup id="cite_ref-FOOTNOTESPL19843.2_18-1" class="reference"><a href="#cite_note-FOOTNOTESPL19843.2-18"><span class="cite-bracket">[</span>18<span class="cite-bracket">]</span></a></sup>
</p><p>Pointers were declared by adding the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">POINTER</code> modifier to any variable declaration, and the memory location of a variable dereferenced with the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">@</code>. Thus <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">INTEGER POINTER P:=@A</code> declares a pointer whose value contains the address of the variable A, not the value of A.<sup id="cite_ref-FOOTNOTESPL19842.13_19-0" class="reference"><a href="#cite_note-FOOTNOTESPL19842.13-19"><span class="cite-bracket">[</span>19<span class="cite-bracket">]</span></a></sup> <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">@</code> can be used on either side of the assignment; <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">@P:=A</code> puts the value of A into P, likely resulting in a <a href="Dangling_pointer" title="Dangling pointer">dangling pointer</a>, <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">@P:=@A</code> makes P point to A, while <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">P:=A</code> puts the value of A into the location currently pointed to by P.<sup id="cite_ref-FOOTNOTESPL19844.4_20-0" class="reference"><a href="#cite_note-FOOTNOTESPL19844.4-20"><span class="cite-bracket">[</span>20<span class="cite-bracket">]</span></a></sup>
</p><p>In a similar fashion, SPL includes C-like array support in which the index variable is a number-of-words offset from the memory location set for the initial variable. Unlike C, SPL only provided one-dimensional arrays, and used parentheses as opposed to brackets.<sup id="cite_ref-FOOTNOTESPL19842.12_21-0" class="reference"><a href="#cite_note-FOOTNOTESPL19842.12-21"><span class="cite-bracket">[</span>21<span class="cite-bracket">]</span></a></sup> Variables could also be declared <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">GLOBAL</code>, in which case no local memory was set aside for them and the storage was assumed to be declared in another library.<sup id="cite_ref-FOOTNOTESPL19843.6_22-0" class="reference"><a href="#cite_note-FOOTNOTESPL19843.6-22"><span class="cite-bracket">[</span>22<span class="cite-bracket">]</span></a></sup> This mirrors the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">extern</code> keyword in C.
</p><p>Literals can be specified with various suffixes, and those without a suffix are assumed to be <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">INTEGER</code>. For instance, <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">1234</code> would be interpreted as an <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">INTEGER</code>, while <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">1234D</code> was a <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">DOUBLE</code>. <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">E</code> denoted a <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">REAL</code> and <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">L</code> a <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">LONG</code>.<sup id="cite_ref-FOOTNOTESPL19842.6_23-0" class="reference"><a href="#cite_note-FOOTNOTESPL19842.6-23"><span class="cite-bracket">[</span>23<span class="cite-bracket">]</span></a></sup> String constants were delimited by double-quotes, and double-quotes within a line were escaped with a second double-quote.<sup id="cite_ref-FOOTNOTESPL19842.11_24-0" class="reference"><a href="#cite_note-FOOTNOTESPL19842.11-24"><span class="cite-bracket">[</span>24<span class="cite-bracket">]</span></a></sup>
</p><p>Variable declarations could use constants to define an initial value, as in <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">INTEGER A:=10</code>. Note the use of the assign-to rather than is-a. Additionally, SPL had a <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">EQUATE</code> keyword that allowed a string of text to be defined as a variable, and then replaced any instances of that variable in the code with the literal string during compiles.<sup id="cite_ref-FOOTNOTESPL19843.18_25-0" class="reference"><a href="#cite_note-FOOTNOTESPL19843.18-25"><span class="cite-bracket">[</span>25<span class="cite-bracket">]</span></a></sup> This is similar to the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">const</code> keyword in C.
</p>
<div class="mw-heading mw-heading3"><h3 id="Memory_segmentation">Memory segmentation</h3></div>
<p>The classic HP 3000 organized physical memory into 1, 2, 4, 8, or 16 banks of 64K (65536) 16-bit words (128K bytes). Code (shared, non-modifiable) and data were separate from each other and stored in variable-length segments of up to 32K words each. Within a process, data addresses such as pointers were 16-bit offsets from a base register (known as DB), or relative offsets from a pointer register (Q or S) that resulted in a valid address within the process's data area (called the stack). While primarily 16-bit word-oriented, the system supported addressing of individual bytes in an array by using the word address where the byte was stored shifted left 1 bit then adding 0 to access the upper byte, or 1 for the lower byte. Thus byte addresses were separate and distinct from word addresses and the interpretation of an address was purely contextual. This proved to be quite troublesome and was the source of numerous bugs in both system and user code. Care had to be taken to treat byte addresses as 16-bit unsigned (that is, type LOGICAL) when using them in, for example, length computations, because otherwise a byte address of 2^16 or more would be treated as a 2s-complement signed value resulting in erroneous calculation of lengths or offsets.
</p><p>An individual process had access to up to 254 code segments of up to 32K words each. The code segments were divided into two domains: the first 191 were "system" segments shared by all processes, and the remaining 63 were "user" segments shared by all running the same program. Control transfer specified either a routine number within the current segment, or an external segment number and a routine number within it. A small table at the end of the segment provided the entry point address for the routine.
</p><p>A process's code acted on data in the stack, a single private segment also up to 32K words in size. Unlike stacks in other architectures, the HP 3000 stack was used for process globals, state preservation, procedure locals (supporting nested calls and re-entrancy), and numeric computation/evaluation. The operating system provided facilities for access to additional memory-based (non-stack) data segments, but these were not natively addressed by the instruction set and so the program was responsible for moving data from and to such "extra data segments" as necessary.
</p><p>SPL included a variety of support systems to allow programs to be easily segmented and then make that segmentation relatively invisible in the code. The primary mechanism was to use the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">$CONTROL SEGMENT=asegmentname</code> <a href="Directive_(programming)" title="Directive (programming)">compiler directive</a> which defined which segment the following code should be placed in. The default was <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">MAINLINESEG</code>, but the programmer could add any number of additional named segments to organize the code into blocks.<sup id="cite_ref-FOOTNOTESPL19841.8_26-0" class="reference"><a href="#cite_note-FOOTNOTESPL19841.8-26"><span class="cite-bracket">[</span>26<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading3"><h3 id="Other_features">Other features</h3></div>
<p>SPL included a "bit-extraction" feature that allowed simplified <a href="Bit_fiddling" class="mw-redirect" title="Bit fiddling">bit fiddling</a>. Any bit, or string of bits, in a word could be accessed using the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">.(x:y)</code> syntax, where x and y were the start and end bit positions from 0 to 15. (Significantly, x and y must be constants known at compile time.) Thus <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">A.(8:15)</code> returned the lower byte of the word storing A.<sup id="cite_ref-FOOTNOTESPL19844.6_27-0" class="reference"><a href="#cite_note-FOOTNOTESPL19844.6-27"><span class="cite-bracket">[</span>27<span class="cite-bracket">]</span></a></sup> This format could be used to split and merge bits as needed. Additionally, additional operations were provided for shifts and rotates, and could be applied to any variable with the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">&</code>, for instance <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">A:=A & LSR(3)</code>.<sup id="cite_ref-FOOTNOTESPL19844.9_28-0" class="reference"><a href="#cite_note-FOOTNOTESPL19844.9-28"><span class="cite-bracket">[</span>28<span class="cite-bracket">]</span></a></sup>
</p>
<div class="mw-heading mw-heading2"><h2 id="Example">Example</h2></div>
<p>This simple program, from the 1984 version of the reference manual, shows most of the features of the SPL language.<sup id="cite_ref-FOOTNOTESPL19841.5_11-1" class="reference"><a href="#cite_note-FOOTNOTESPL19841.5-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>
</p><p>The program as a whole is delimited between the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">BEGIN</code> and <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">END.</code>. It begins with the definition of a series of global variables, A, B and C, defines a single procedure and then calls it twenty times. Note that the procedure does not have a BEGIN and END of its own because it contains only one line of actual code, <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">X:=X*(Y+Z);</code> the <code class="mw-highlight mw-highlight-lang-text mw-content-ltr" style="" dir="ltr">INTEGER X,Y,Z</code> is not considered part of the code itself, it is indicating the type of the three parameters being passed in on the line above and is considered part of that line.<sup id="cite_ref-FOOTNOTESPL19841.5_11-2" class="reference"><a href="#cite_note-FOOTNOTESPL19841.5-11"><span class="cite-bracket">[</span>11<span class="cite-bracket">]</span></a></sup>
</p>
<pre> BEGIN
INTEGER A:=0, B, C:=1;
PROCEDURE N(X,Y,Z);
INTEGER X,Y,Z;
X:=X*(Y+Z);
FOR B:=1 UNTIL 20 DO
N(A,B,C);
END.
</pre>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Citations">Citations</h3></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */
.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}
/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap mw-references-columns"><ol class="references">
<li id="cite_note-FOOTNOTELeibson2017-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTELeibson2017_1-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFLeibson2017">Leibson 2017</a>.</span>
</li>
<li id="cite_note-2116A-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2116A_2-0">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.hp.com/hpinfo/abouthp/histnfacts/museum/earlyinstruments/0001/0001history.html">"History of the 2116A digital computer"</a>. <i>HP</i>.</cite></span>
</li>
<li id="cite_note-SMECC-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-SMECC_3-0">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.smecc.org/hewlett_packard.htm">"Hewlett/Packard Computers"</a>. <q>The 2000A was the first HP 2000 time share system on the market ca. 1969</q></cite></span>
</li>
<li id="cite_note-FOOTNOTEGreen2004-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTEGreen2004_4-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFGreen2004">Green 2004</a>.</span>
</li>
<li id="cite_note-FOOTNOTEEdler1995-5"><span class="mw-cite-backlink">^ <a href="#cite_ref-FOOTNOTEEdler1995_5-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FOOTNOTEEdler1995_5-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-FOOTNOTEEdler1995_5-2"><sup><i><b>c</b></i></sup></a> <a href="#cite_ref-FOOTNOTEEdler1995_5-3"><sup><i><b>d</b></i></sup></a></span> <span class="reference-text"><a href="#CITEREFEdler1995">Edler 1995</a>.</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text"><cite id="CITEREFBakerParker1979" class="citation web cs1">Baker, Henry; Parker, Clinton (September 1979). <a rel="nofollow" class="external text" href="http://www.bitsavers.org/pdf/xerox/alto/micro-spl/Micro-SPL_Sep79.pdf">"Micro-SPL"</a> <span class="cs1-format">(PDF)</span>.</cite></span>
</li>
<li id="cite_note-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-7">^</a></b></span> <span class="reference-text"><cite id="CITEREFParker2015" class="citation interview cs1">Parker, Clinton (31 December 2015). <a rel="nofollow" class="external text" href="https://ataripodcast.libsyn.com/antic-interview-111-clinton-parker-action">"ANTIC Interview 111, Clinton Parker, Action!"</a> (podcast). Interviewed by Randy Kindig.</cite></span>
</li>
<li id="cite_note-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-8">^</a></b></span> <span class="reference-text"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.allegro.com/products/mpe/splash/prog.guide.html">"SPLash! The Native Mode SPL Compiler for MPE/iX"</a>. Allegro Consultants. 1 January 2004.</cite></span>
</li>
<li id="cite_note-FOOTNOTESPL19841.2,_1.3-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19841.2,_1.3_9-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 1.2, 1.3.</span>
</li>
<li id="cite_note-FOOTNOTESPL19841.1-10"><span class="mw-cite-backlink">^ <a href="#cite_ref-FOOTNOTESPL19841.1_10-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FOOTNOTESPL19841.1_10-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, p. 1.1.</span>
</li>
<li id="cite_note-FOOTNOTESPL19841.5-11"><span class="mw-cite-backlink">^ <a href="#cite_ref-FOOTNOTESPL19841.5_11-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FOOTNOTESPL19841.5_11-1"><sup><i><b>b</b></i></sup></a> <a href="#cite_ref-FOOTNOTESPL19841.5_11-2"><sup><i><b>c</b></i></sup></a></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 1.5.</span>
</li>
<li id="cite_note-FOOTNOTESPL19841.11-12"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19841.11_12-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 1.11.</span>
</li>
<li id="cite_note-FOOTNOTESPL19847–4-13"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19847–4_13-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 7–4.</span>
</li>
<li id="cite_note-FOOTNOTESPL19843.15-14"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19843.15_14-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 3.15.</span>
</li>
<li id="cite_note-FOOTNOTESPL19841.13,_1.14-15"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19841.13,_1.14_15-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 1.13, 1.14.</span>
</li>
<li id="cite_note-FOOTNOTESPL19842.1–2.3-16"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19842.1–2.3_16-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 2.1–2.3.</span>
</li>
<li id="cite_note-FOOTNOTESPL19842.4-17"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19842.4_17-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 2.4.</span>
</li>
<li id="cite_note-FOOTNOTESPL19843.2-18"><span class="mw-cite-backlink">^ <a href="#cite_ref-FOOTNOTESPL19843.2_18-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-FOOTNOTESPL19843.2_18-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 3.2.</span>
</li>
<li id="cite_note-FOOTNOTESPL19842.13-19"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19842.13_19-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 2.13.</span>
</li>
<li id="cite_note-FOOTNOTESPL19844.4-20"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19844.4_20-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 4.4.</span>
</li>
<li id="cite_note-FOOTNOTESPL19842.12-21"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19842.12_21-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 2.12.</span>
</li>
<li id="cite_note-FOOTNOTESPL19843.6-22"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19843.6_22-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 3.6.</span>
</li>
<li id="cite_note-FOOTNOTESPL19842.6-23"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19842.6_23-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 2.6.</span>
</li>
<li id="cite_note-FOOTNOTESPL19842.11-24"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19842.11_24-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 2.11.</span>
</li>
<li id="cite_note-FOOTNOTESPL19843.18-25"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19843.18_25-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 3.18.</span>
</li>
<li id="cite_note-FOOTNOTESPL19841.8-26"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19841.8_26-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 1.8.</span>
</li>
<li id="cite_note-FOOTNOTESPL19844.6-27"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19844.6_27-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 4.6.</span>
</li>
<li id="cite_note-FOOTNOTESPL19844.9-28"><span class="mw-cite-backlink"><b><a href="#cite_ref-FOOTNOTESPL19844.9_28-0">^</a></b></span> <span class="reference-text"><a href="#CITEREFSPL1984">SPL 1984</a>, pp. 4.9.</span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading3"><h3 id="Bibliography">Bibliography</h3></div>
<ul><li><cite id="CITEREFEdler1995" class="citation journal cs1 cs1-prop-unfit">Edler, Christopher (November 1995). <a rel="nofollow" class="external text" href="https://web.archive.org/web/20020203011918/http://www.3k.com/papers/hp3000_history.html">"The Strongest Castle: The Rise, Fall and Rise of the HP 3000"</a>. <i>The Analytical Engine</i>. <b>3</b> (1). <a href="ISSN_(identifier)" class="mw-redirect" title="ISSN (identifier)">ISSN</a> <a rel="nofollow" class="external text" href="https://search.worldcat.org/issn/1071-6351">1071-6351</a>. Archived from the original on 3 February 2002.</cite></li>
<li><cite id="CITEREFGreen2004" class="citation book cs1">Green, Bob (2004). <a rel="nofollow" class="external text" href="http://www.robelle.com/smugbook/smug4.html"><i>HP3000 Evolution</i></a>. Robelle.</cite></li>
<li><cite id="CITEREFLeibson2017" class="citation web cs1">Leibson, Steve (2017). <a rel="nofollow" class="external text" href="http://www.hp9825.com/html/hp_2116.html">"HP: The Accidentally, On-Purpose Computer Company"</a>. <i>HP9825.COM</i>.</cite></li>
<li><cite id="CITEREFSPL1984" class="citation book cs1"><a rel="nofollow" class="external text" href="http://www.bitsavers.org/pdf/hp/3000/spl/30000-90024_SPLref_Feb84.pdf"><i>Systems Programming Language reference manual</i></a> <span class="cs1-format">(PDF)</span>. Hewlett-Packard. February 1984.</cite></li></ul>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" · ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}
/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="Hewlett-Packard_software449" style="padding:3px"><table class="nowraplinks hlist mw-collapsible mw-collapsed navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="3"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div id="Hewlett-Packard_software449" style="font-size:114%;margin:0 4em"><a href="Hewlett-Packard" title="Hewlett-Packard">Hewlett-Packard</a> software</div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%">Applications and utilities</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="OpenText_ALM" title="OpenText ALM">ALM</a>†</li>
<li><a href="HP_Application_Security_Center" title="HP Application Security Center">Application Security Center</a></li>
<li><a href="HP_Business_Service_Automation" title="HP Business Service Automation">Business Service Automation</a></li>
<li><a href="HP_Business_Service_Management" title="HP Business Service Management">Business Service Management</a></li>
<li><a href="HP_Client_Automation_Software" title="HP Client Automation Software">Client Automation Software</a></li>
<li><a href="HP_Cloud_Service_Automation_Software" title="HP Cloud Service Automation Software">Cloud Service Automation Software</a></li>
<li><a href="Taligent" title="Taligent">CommonPoint</a>†</li>
<li><a href="Micro_Focus_Enterprise_Security_Products" title="Micro Focus Enterprise Security Products">Enterprise Security Products</a>†</li>
<li><a href="Iconv" title="Iconv">iconv</a></li>
<li><a href="HP_Information_Management_Software" title="HP Information Management Software">Information Management Software</a>†</li>
<li><a href="HP_Integrity_Virtual_Machines" title="HP Integrity Virtual Machines">Integrity Virtual Machines</a></li>
<li><a href="HP_IT_Management_Software" title="HP IT Management Software">IT Management Software</a></li>
<li><a href="HP_Linux_Imaging_and_Printing" title="HP Linux Imaging and Printing">Linux Imaging and Printing</a>*</li>
<li><a href="Mscape" title="Mscape">mscape</a></li>
<li><a href="HP_Network_Management_Center" title="HP Network Management Center">Network Management Center</a>†</li>
<li><a href="HP_Open_Extensibility_Platform" title="HP Open Extensibility Platform">Open Extensibility Platform</a></li>
<li><a href="HP_OpenMail" title="HP OpenMail">OpenMail</a></li>
<li><a href="HP_OpenView" title="HP OpenView">OpenView</a>
<ul><li><a href="HP_OpenView_Storage_Area_Manager" title="HP OpenView Storage Area Manager">Storage Area Manager</a></li></ul></li>
<li><a href="OpenText_Quality_Center" title="OpenText Quality Center">OpenText Quality Center</a>†</li>
<li><a href="UFT_One" title="UFT One">QuickTest Professional</a>†</li>
<li><a href="HP_Release_Control" title="HP Release Control">Release Control</a></li>
<li><a href="Remote_Graphics_Software" title="Remote Graphics Software">Remote Graphics Software</a>*</li>
<li><a href="HPE_Service_Activator" title="HPE Service Activator">Service Activator</a>**</li>
<li><a href="HP_Service_Manager" title="HP Service Manager">Service Manager</a>†</li>
<li><a href="HP_Serviceguard" title="HP Serviceguard">Serviceguard</a></li>
<li><a href="OpenText_SiteScope" title="OpenText SiteScope">SiteScope</a>†</li>
<li><a href="Snapfish_Lab" title="Snapfish Lab">Snapfish Lab</a></li>
<li><a href="HPE_Systems_Insight_Manager" title="HPE Systems Insight Manager">Systems Insight Manager</a>**</li>
<li><a href="Tesseract_(software)" title="Tesseract (software)">Tesseract</a>†</li>
<li><a href="Micro_Focus_Content_Manager" title="Micro Focus Content Manager">TRIM</a>†</li>
<li><a href="Visual_User_Environment" title="Visual User Environment">Visual User Environment</a></li>
<li><a href="HP_WinRunner" title="HP WinRunner">WinRunner</a></li></ul>
</div></td><td class="noviewer navbox-image" rowspan="5" style="width:1px;padding:0 0 0 2px"><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Database</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Enscribe" title="Enscribe">Enscribe</a>**</li>
<li><a href="NonStop_SQL" title="NonStop SQL">NonStop SQL</a>**</li>
<li><a href="UCMDB" title="UCMDB">UCMDB</a>†</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">File systems and formats</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Hi_Performance_FileSystem" title="Hi Performance FileSystem">Hi Performance FileSystem</a>**</li>
<li><a href="System_Object_Model_(file_format)" title="System Object Model (file format)">System Object Model</a>**</li>
<li><a href="Veritas_File_System" title="Veritas File System">Veritas File System</a>‡</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Operating systems and environments</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Domain/OS" title="Domain/OS">Domain/OS</a></li>
<li><a href="HP-UX" title="HP-UX">HP-UX</a>**</li>
<li><a href="HyperSpace_(software)" title="HyperSpace (software)">HyperSpace</a></li>
<li><a href="System_Manager_(HP_LX)" title="System Manager (HP LX)">HP LX System Manager</a></li>
<li><a href="HP_Multi-Programming_Executive" title="HP Multi-Programming Executive">MPE</a></li>
<li><a href="NewWave" title="NewWave">NewWave</a></li>
<li><a href="NonStop_(server_computers)" title="NonStop (server computers)">NonStop OS</a>**</li>
<li><a href="OpenVMS" title="OpenVMS">OpenVMS</a>**</li>
<li><a href="QuickPlay" title="QuickPlay">QuickPlay</a></li>
<li><a href="Rocky_Mountain_BASIC" title="Rocky Mountain BASIC">Rocky Mountain BASIC</a></li>
<li><a href="HP_Time-Shared_BASIC" title="HP Time-Shared BASIC">Time-Shared BASIC</a></li>
<li><a href="Tru64_UNIX" title="Tru64 UNIX">Tru64 UNIX</a>**</li>
<li><a href="WebOS" title="WebOS">webOS</a>†</li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Protocols and languages</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="HP_ePrint" title="HP ePrint">ePrint</a>*</li>
<li><a href="HP-GL" title="HP-GL">HP-GL</a></li>
<li><a href="InkML" title="InkML">InkML</a></li>
<li><a href="PowerHouse_(programming_language)" title="PowerHouse (programming language)">PowerHouse</a>‡</li>
<li><a href="Printer_Command_Language" title="Printer Command Language">Printer Command Language</a>
<ul><li><a href="Hewlett-Packard_Raster_Transfer_Language" title="Hewlett-Packard Raster Transfer Language">Raster Transfer Language</a></li></ul></li>
<li><a href="Printer_Job_Language" title="Printer Job Language">Printer Job Language</a></li>
<li><a href="HP_Universal_Print_Driver" title="HP Universal Print Driver">Universal Print Driver</a>*</li></ul>
</div></td></tr><tr><td class="navbox-abovebelow" colspan="3"><div>
<ul><li>Asterisk (*) denotes software continued by <a href="HP_Inc." title="HP Inc.">HP Inc.</a></li>
<li>Double asterisk (**) denotes software continued by <a href="Hewlett_Packard_Enterprise" title="Hewlett Packard Enterprise">Hewlett Packard Enterprise</a></li>
<li>Dagger (†) denotes software divested and sold off</li>
<li>Double dagger (‡) denotes third-party software</li></ul>
</div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-08-04" href="https://en.wikipedia.org/wiki/?title=Systems_Programming_Language&oldid=1304246478">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>